package pe.gob.osinergmin.activity.module;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.gob.osinergmin.R;
import pe.gob.osinergmin.activity.dialog.ImageDialog;
import pe.gob.osinergmin.activity.generic.GenericBackActionBarActivity;
import pe.gob.osinergmin.bean.SupervisionMovil;
import pe.gob.osinergmin.bean.SupervisionMovilDetalleSeguridad;
import pe.gob.osinergmin.bean.common.GuiaFiscalizacionDetalle;
import pe.gob.osinergmin.bean.common.Usuario;
import pe.gob.osinergmin.utils.PuntoControlConstants;
import pe.gob.osinergmin.utils.PuntoControlDetalleSeguridadControl;
import pe.gob.osinergmin.utils.PuntoControlUtils;

import static android.widget.CompoundButton.OnCheckedChangeListener;
import static pe.gob.osinergmin.utils.PuntoControlConstants.SESSION_USER_VAR;

public class SeguridadActivity extends GenericBackActionBarActivity {

    public int _toolbar = R.id.seguridad_toolbar;

    public static int code = 1;

    private List<GuiaFiscalizacionDetalle> listPregunta;

    private TableLayout tblPreguntas;

    private Usuario usuario;

    private List<SupervisionMovilDetalleSeguridad> supervisionMovilDetalleSeguridadList;

    private SupervisionMovil supervisionMovil;

    private File tmpImageFile;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module_seguridad);
        setToolbar((Toolbar) findViewById(_toolbar));
        setSupportActionBar(getToolbar());
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        if(PuntoControlUtils.getProgressDialog().isShowing()){
            PuntoControlUtils.getProgressDialog().dismiss();
        }

        usuario = (Usuario)getIntent().getExtras().getSerializable(SESSION_USER_VAR);

        try {
            listPregunta = getGuiaFiscalizacionDetalleService().getGuiaFiscalizacionDetalleList(this);
        } catch (Exception e) {
            e.printStackTrace();
        }

        writeStatusBar();

        LinearLayout btnRegresar = (LinearLayout)getToolbar().findViewById(R.id.btnRegresar);
        btnRegresar.setOnClickListener(this);

        ImageView btnSave = (ImageView)getToolbar().findViewById(R.id.btnSave);
        btnSave.setOnClickListener(this);

        tblPreguntas = (TableLayout) findViewById(R.id.tblPreguntas);

        if(listPregunta != null){

            // Se realiza la busqueda de la última supervisión no sincronizada de la placa
            SupervisionMovil _supervisionMovil = new SupervisionMovil();
            _supervisionMovil.setPlaca(PuntoControlConstants.unidadOperativa.getPlaca());
            _supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SEGURIDAD);
            _supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);

            try {
                supervisionMovil = getSupervisionMovilService().findSupervisionMovil(this, _supervisionMovil);
            } catch (Exception e) {
                e.printStackTrace();
            }

            if(supervisionMovil == null){
                // Si existe una supervision se genera una nueva
                createNewSupervisionMovil();
            }else{
                // Se obtienen los datos de la supervision anterior
                SupervisionMovilDetalleSeguridad supervisionMovilDetalleSeguridad = new SupervisionMovilDetalleSeguridad();
                supervisionMovilDetalleSeguridad.setPlaca(supervisionMovil.getPlaca());
                supervisionMovilDetalleSeguridad.setFechaRegistro(supervisionMovil.getFechaRegistro());
                try {
                    supervisionMovilDetalleSeguridadList = getSupervisionMovilDetalleSeguridadService().getSupervisionMovilDetalleSeguridadList(this, supervisionMovilDetalleSeguridad);
                } catch (Exception e) {
                    supervisionMovilDetalleSeguridadList = new ArrayList<>();
                }

                supervisionMovil.setFechaRegistro(new Date());

                actualizarDetalle(supervisionMovilDetalleSeguridadList, supervisionMovil);
            }

            (new AsyncTask<Void, Void, Void>(){
                @Override
                protected void onPreExecute() {
                    PuntoControlUtils.getProgressDialog(SeguridadActivity.this, getResources().getString(R.string.waiting_load_guia)).show();
                }

                @Override
                protected Void doInBackground(Void... params) {
                    drawPreguntas();
                    updateCheckedList();
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    PuntoControlUtils.getProgressDialog().dismiss();
                }
            }).doInBackground();
        }
    }

    private void createNewSupervisionMovil() {
        // Si no se encuentra registrada ninguna supervision de tipo SEGURIDAD en el dispositivo para la placa
        supervisionMovil = new SupervisionMovil();
        supervisionMovil.setPlaca(PuntoControlConstants.unidadOperativa.getPlaca());
        supervisionMovil.setFechaRegistro(new Date());

        supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SEGURIDAD);
        supervisionMovil.setLatitud(getPuntoControlGPSTracker().getLatitude());
        supervisionMovil.setLongitud(getPuntoControlGPSTracker().getLongitude());

        supervisionMovil.setCodigoOsinergmin(PuntoControlConstants.unidadOperativa.getCodigoOsinergmin());
        supervisionMovil.setRazonSocial(PuntoControlConstants.unidadOperativa.getRazonSocial());
        supervisionMovil.setRuc(PuntoControlConstants.unidadOperativa.getRuc());

        supervisionMovil.setUsuario(usuario.getUsername());
        supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);

        createDetalleSupervisionMovil();
    }

    private void createDetalleSupervisionMovil(){
        supervisionMovilDetalleSeguridadList = new ArrayList<>();
        for(GuiaFiscalizacionDetalle pregunta : listPregunta){
            SupervisionMovilDetalleSeguridad supervisionMovilDetalleSeguridad = new SupervisionMovilDetalleSeguridad();
            supervisionMovilDetalleSeguridad.setPlaca(supervisionMovil.getPlaca());
            supervisionMovilDetalleSeguridad.setFechaRegistro(supervisionMovil.getFechaRegistro());
            supervisionMovilDetalleSeguridad.setGuiaFiscalizacionDetalle(pregunta.getCodigo());
            supervisionMovilDetalleSeguridad.setRespuesta(true);
            supervisionMovilDetalleSeguridadList.add(supervisionMovilDetalleSeguridad);
        }
    }

    private void actualizarDetalle(List<SupervisionMovilDetalleSeguridad> supervisionMovilDetalleSeguridadList, SupervisionMovil supervisionMovil) {
        if(supervisionMovilDetalleSeguridadList != null && supervisionMovilDetalleSeguridadList.size() > 0){
            for(SupervisionMovilDetalleSeguridad supervisionMovilDetalleSeguridad : supervisionMovilDetalleSeguridadList){
                supervisionMovilDetalleSeguridad.setFechaRegistro(supervisionMovil.getFechaRegistro());
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnRegresar:
                this.finish();
                break;
            case R.id.btnSave:
                try {
                    getSupervisionMovilService().saveSupervisionMovilToLocal(this, supervisionMovil);
                    getSupervisionMovilDetalleSeguridadService().saveSupervisionMovilDetalleSeguridadListToLocal(this, supervisionMovilDetalleSeguridadList);
                    showToast(this, R.string.seguridad_message_save_sucessfully, Toast.LENGTH_SHORT);
                    temporalSaveInformation(true);
                    this.finish();
                }catch(Exception e){
                    showToast(this, R.string.seguridad_message_save_error, Toast.LENGTH_SHORT);
                }
                break;
        }
    }

    private void drawPreguntas(){
        LayoutInflater inflater = getLayoutInflater();
        for(GuiaFiscalizacionDetalle detalle : listPregunta){
            if(detalle != null){
                @SuppressLint("InflateParams") View row = inflater.inflate(R.layout.item_table_seguridad, null);

                TextView codigo = (TextView)row.findViewById(R.id.txtCodigo);
                codigo.setText(detalle.getCodigoObservacion());

                // Informacion de la descripcion de la pregunta
                TextView descripcion = (TextView)row.findViewById(R.id.txtDescripcion);
                descripcion.setText(detalle.getDescripcion());

                TextView baseLegal = (TextView)row.findViewById(R.id.txtBaseLegal);
                baseLegal.setText(R.string.seguridad_link_base_legal);
                baseLegal.setId(detalle.getCodigo());
                baseLegal.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int codigo = v.getId();
                        GuiaFiscalizacionDetalle selected = getPreguntaById(codigo);
                        if(selected != null){
                            showToast(getBaseContext(), selected.getBaseLegal(), Toast.LENGTH_LONG);
                        }else{
                            showToast(getBaseContext(), R.string.error_cant_find_base_legal, Toast.LENGTH_SHORT);
                        }
                    }
                });

                TextView detalleSeguridad = (TextView)row.findViewById(R.id.lnkDetalleSeguridad);
                detalleSeguridad.setText(R.string.seguridad_link_detalle_observacion);
                detalleSeguridad.setId(detalle.getCodigo());
                detalleSeguridad.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int codigo = v.getId();
                        GuiaFiscalizacionDetalle selected = getPreguntaById(codigo);
                        if(selected != null){
                            File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/Osinergmin/");
                            if(!directory.exists()){
                                boolean created = directory.mkdir();
                                Log.d("<SeguridadActivity:drawPreguntas>", String.valueOf(created));
                            }
                            tmpImageFile = new File(directory,"seguridad_"+PuntoControlConstants.unidadOperativa.getCodigoOsinergmin()+"_"+codigo+"_"+supervisionMovil.getFechaRegistro().getTime()+".jpg");
                            if(tmpImageFile.exists()){
                                ImageDialog imageDialog = new ImageDialog(v.getContext());
                                imageDialog.setImgFile(tmpImageFile);
                                imageDialog.setCancelable(false);
                                imageDialog.setSupervisionMovilDetalleSeguridadList(supervisionMovilDetalleSeguridadList);
                                imageDialog.show();
                            }else {
                                Uri uri = Uri.fromFile(tmpImageFile);
                                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); // 0 Low Quality / 1 High Quality
                                startActivityForResult(intent, 0);
                            }
                            temporalSaveInformation();
                        }
                    }
                });

                // Toggle Cumple
                ToggleButton cumple = (ToggleButton)row.findViewById(R.id.btnSwitch);
                cumple.setId(detalle.getCodigo());
                cumple.setOnCheckedChangeListener(new OnCheckedChangeListener(){

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        int codigo = buttonView.getId();
                        int index = getIndexDetalleById(codigo);
                        SupervisionMovilDetalleSeguridad selected = getDetalleById(codigo);
                        if(selected != null){
                            selected.setRespuesta(isChecked);
                            supervisionMovilDetalleSeguridadList.set(index, selected);
                            if(!isChecked){
                                getLnk(buttonView).setVisibility(View.VISIBLE);
                            }else{
                                getLnk(buttonView).setVisibility(View.INVISIBLE);
                            }
                        }
                    }
                });

                tblPreguntas.addView(row);
            }
        }
    }

    private TextView getLnk(CompoundButton buttonView){
        TableRow row = (TableRow)buttonView.getParent();
        LinearLayout row_mid = (LinearLayout)row.findViewById(R.id.seguridad_rowmid);
        TableLayout tblEnlacesSeguridad = (TableLayout)row_mid.findViewById(R.id.tblEnlacesSeguridad);
        TableRow link_row = (TableRow)tblEnlacesSeguridad.getChildAt(0);
        for(int i = 0; i < link_row.getChildCount(); i++){
            View child = link_row.getChildAt(i);
            if(child instanceof TextView){
                TextView textView = (TextView)child;
                if(textView.getText().toString().equals(getResources().getString(R.string.seguridad_link_detalle_observacion))){
                    return textView;
                }
            }
        }
        return null;
    }

    private GuiaFiscalizacionDetalle getPreguntaById(int id){
        for(GuiaFiscalizacionDetalle detalle : listPregunta){
            if(id == detalle.getCodigo()){
                return detalle;
            }
        }
        return null;
    }

    private int getIndexDetalleById(int id){
        if(supervisionMovilDetalleSeguridadList == null) createDetalleSupervisionMovil();
        for(int i = 0; i < supervisionMovilDetalleSeguridadList.size(); i++){
            SupervisionMovilDetalleSeguridad detalle = supervisionMovilDetalleSeguridadList.get(i);
            if(id == detalle.getGuiaFiscalizacionDetalle()){
                return i;
            }
        }
        return -1;
    }

    private SupervisionMovilDetalleSeguridad getDetalleById(int id){
        int index = getIndexDetalleById(id);
        if(index != -1){
            return supervisionMovilDetalleSeguridadList.get(index);
        }
        return null;
    }

    private void writeStatusBar(){
        // Colocando la bienvenida
        TableLayout tableLayout = (TableLayout) findViewById(R.id.seguridad_status_bar);
        TextView nombre = (TextView) tableLayout.findViewById(R.id.status_bar_nombre);
        String txtNombre = MessageFormat.format(getResources().getString(R.string.menu_welcome), usuario.getNombreCompleto());
        nombre.setText(txtNombre);

        TextView placa = (TextView)tableLayout.findViewById(R.id.status_bar_placa);
        if(PuntoControlConstants.unidadOperativa != null && (!PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) && PuntoControlConstants.unidadOperativa.getPlaca() != null)){
            String txtPlaca = MessageFormat.format(getResources().getString(R.string.menu_placa), PuntoControlConstants.unidadOperativa.getPlaca());
            placa.setText(txtPlaca);
        }else{
            placa.setText(PuntoControlConstants.EMPTY);
        }
    }

    private void updateCheckedList(){
        if(supervisionMovilDetalleSeguridadList != null) {
            PuntoControlUtils.getProgressDialog(this, getResources().getString(R.string.waiting_load_answer)).show();
            for (SupervisionMovilDetalleSeguridad supervisionMovilDetalleSeguridad : supervisionMovilDetalleSeguridadList) {
                if (!supervisionMovilDetalleSeguridad.getRespuesta()) {
                    Integer codigo = supervisionMovilDetalleSeguridad.getGuiaFiscalizacionDetalle();
                    for (int i = 0; i < tblPreguntas.getChildCount(); i++) {
                        TableRow row = (TableRow) tblPreguntas.getChildAt(i);
                        if(row != null){
                            View cumple = row.findViewById(codigo);
                            if(cumple != null) {
                                ToggleButton toggle = (ToggleButton)row.getChildAt(2);
                                if(!supervisionMovilDetalleSeguridad.getRespuesta()) {
                                    toggle.toggle();
                                }
                            }
                        }
                    }
                }
            }
            PuntoControlUtils.getProgressDialog().dismiss();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 0:
                switch (resultCode){
                    case Activity.RESULT_OK:
                        ImageDialog imageDialog = new ImageDialog(this);
                        imageDialog.setImgFile(tmpImageFile);
                        imageDialog.setCancelable(false);
                        imageDialog.setSupervisionMovilDetalleSeguridadList(supervisionMovilDetalleSeguridadList);
                        imageDialog.show();
                        break;
                    case Activity.RESULT_CANCELED:
                        showToast(this, R.string.seguridad_cancel_capture, Toast.LENGTH_SHORT);
                        break;
                    default:
                        break;
                }
                break;
        }
    }

    private void temporalSaveInformation(){
        temporalSaveInformation(true);
    }

    private void temporalSaveInformation(boolean delete){
        PuntoControlDetalleSeguridadControl puntoControlDetalleSeguridadControl = new PuntoControlDetalleSeguridadControl(this);
        if(!delete){
            puntoControlDetalleSeguridadControl.saveDetalleSeguridadList(supervisionMovil, supervisionMovilDetalleSeguridadList);
        }else{
            puntoControlDetalleSeguridadControl.clear();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        temporalSaveInformation();
    }

    @Override
    protected void onResume() {
        super.onResume();
        PuntoControlDetalleSeguridadControl puntoControlDetalleSeguridadControl = new PuntoControlDetalleSeguridadControl(this);
        SupervisionMovil _supervisionMovil = puntoControlDetalleSeguridadControl.getSupervisionMovil();
        if(_supervisionMovil != null && PuntoControlConstants.unidadOperativa.getPlaca().equals(_supervisionMovil.getPlaca())){
            supervisionMovil = _supervisionMovil;
            supervisionMovilDetalleSeguridadList = puntoControlDetalleSeguridadControl.getDetalleSeguridadList();
            if(supervisionMovilDetalleSeguridadList == null){
                createDetalleSupervisionMovil();
            }
            updateCheckedList();
        }else{
            if(supervisionMovil == null) {
                createNewSupervisionMovil();
            }
        }
    }
}
